package com.huamoxi.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.huamoxi.entity.SysFile;
import com.huamoxi.mapper.SysFileMapper;
import com.huamoxi.result.Result;
import com.huamoxi.service.SysFileService;
import com.huamoxi.utils.ResultUtil;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.Instant;
import java.util.*;

@Service
public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> implements SysFileService {

    @Value("${upload.path}")
    private String storePath;

    @Value("${upload.bukkit}")
    private String bukkitName;

    @Resource
    private SysFileMapper sysFileMapper;

    @Override
    public Result upload(MultipartFile[] files, Long userId) {
        List<Map<String, Object>> list = new ArrayList<>();
        String targetPath = storePath + File.separator + bukkitName;

        File floder = new File(targetPath);
        if (!floder.exists()) {
            floder.mkdirs();
        }

        for (MultipartFile file : files) {
            Map<String, Object> map = new HashMap<>();
            String fileName = generateRandomFileName();
            String fileToken = generateRandomFileToken();

            map.put("fileName", fileName);
            map.put("fileToken", fileToken);
            list.add(map);

            SysFile sysFile = new SysFile();
            sysFile.setBukkit(bukkitName);
            sysFile.setFilePath(targetPath);
            sysFile.setFileName(fileName);
            sysFile.setToken(fileToken);

            String originalFilename = file.getOriginalFilename();
            sysFile.setFileSourceName(originalFilename.substring(0, originalFilename.lastIndexOf(".")));
            sysFile.setFileSuffix(originalFilename.substring(originalFilename.lastIndexOf(".")));
            sysFile.setFileFullName(originalFilename);

            long fileSizeInBytes = file.getSize(); // 获取文件大小（字节）
            if (fileSizeInBytes < 1024 * 1024) {
                // 小于 1 MB，使用 KB
                sysFile.setFileSize(toKB(fileSizeInBytes));
                sysFile.setFileSizeUnit("KB");
            } else if (fileSizeInBytes < 1024 * 1024 * 1024) {
                // 大于等于 1 MB 且小于 1 GB，使用 MB
                sysFile.setFileSize(toMB(fileSizeInBytes));
                sysFile.setFileSizeUnit("MB");
            } else {
                // 大于等于 1 GB，使用 GB
                sysFile.setFileSize(toGB(fileSizeInBytes));
                sysFile.setFileSizeUnit("GB");
            }

            sysFile.setCreateUserId(userId);
            sysFile.setCreateTime(new Date());
            sysFile.setUpdateTime(new Date());
            // 将文件存储到指定位置
            try {
                File targetFile = new File(targetPath + File.separator + fileName);
                file.transferTo(targetFile); // 保存文件

                sysFileMapper.insert(sysFile);
            } catch (IOException e) {
                return ResultUtil.fail("文件存储失败: " + e.getMessage());
            }
        }
        return ResultUtil.success(list);
    }


    private String generateRandomFileName() {
        long timestamp = Instant.now().toEpochMilli(); // 获取当前时间戳
        int randomNumber = new Random().nextInt(1000); // 生成 0-999 的随机数
        return "file_" + timestamp + "_" + randomNumber;
    }

    private String generateRandomFileToken () {
        return UUID.randomUUID().toString().replace("-", "");
    }

    /**
     * 将字节大小转换为 KB（返回 BigDecimal 类型）
     */
    public static BigDecimal toKB(long sizeInBytes) {
        BigDecimal bytes = new BigDecimal(sizeInBytes);
        BigDecimal kbDivisor = new BigDecimal(1024);
        return bytes.divide(kbDivisor, 2, RoundingMode.HALF_UP); // 保留 2 位小数
    }

    /**
     * 将字节大小转换为 MB（返回 BigDecimal 类型）
     */
    public static BigDecimal toMB(long sizeInBytes) {
        BigDecimal bytes = new BigDecimal(sizeInBytes);
        BigDecimal mbDivisor = new BigDecimal(1024 * 1024);
        return bytes.divide(mbDivisor, 2, RoundingMode.HALF_UP); // 保留 2 位小数
    }

    /**
     * 将字节大小转换为 GB（返回 BigDecimal 类型）
     */
    public static BigDecimal toGB(long sizeInBytes) {
        BigDecimal bytes = new BigDecimal(sizeInBytes);
        BigDecimal gbDivisor = new BigDecimal(1024 * 1024 * 1024);
        return bytes.divide(gbDivisor, 2, RoundingMode.HALF_UP); // 保留 2 位小数
    }
}
